package generatore;

import linguaggio.Element;
import linguaggio.Grammatica;
import java.util.LinkedList;
import linguaggio.NonTerminale;
import linguaggio.Produzione;
import java.io.File;
import java.io.IOException;
import linguaggio.Token;
import java.util.Vector;
import java.util.HashMap;
import linguaggio.AttributeType.tokenType;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

/**
 *
 * @author Giovanni Cammarata
 */
public class GeneratoreTestCalcolatrice {
    LinkedList<Token> tokens = new LinkedList<Token>();
    LinkedList<NonTerminale> nonTerminali;
    Generatore instance;
    
    public GeneratoreTestCalcolatrice() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }
    
    @Before
    public void setUp() {
        Token tk1 = null;
        Token tk2 = null;
        Token tk3 = null;
        Token tk4 = null;
        Token tk5 = null;
        Token tk6 = null;
        //Aggiungo i token
//        tk = new Token("NUMBER","[1-9]+[0-9]*",language.AttributeType.tokenType.dval);
//        v.add(tk);
        
        tk1 = new Token("NL","\\n",linguaggio.AttributeType.tokenType.niente);
        tokens.add(tk1);
        tk2 = new Token("NUMBER","[0-9]+",linguaggio.AttributeType.tokenType.dval);
        tokens.add(tk2);
        
        tk3 = new Token("PIU","\"+\"",linguaggio.AttributeType.tokenType.niente);
        tokens.add(tk3);
        tk4 = new Token("MENO","\"-\"",linguaggio.AttributeType.tokenType.niente);
        tokens.add(tk4);
        tk5 = new Token("PER","\"*\"",linguaggio.AttributeType.tokenType.niente);
        tokens.add(tk5);
        tk6 = new Token("DIVISO","\"/\"",linguaggio.AttributeType.tokenType.niente);
        tokens.add(tk6);
        
        Produzione p = null;
        //aggiungo le produzioni alla mappa
        nonTerminali = new LinkedList<>();
        NonTerminale line = new NonTerminale("line");
        line.setThisTokenType(tokenType.niente);
        
        NonTerminale exp = new NonTerminale("exp");
        exp.setThisTokenType(tokenType.dval);
        
        NonTerminale input = new NonTerminale("input");
        input.setThisTokenType(tokenType.niente);
        
        LinkedList<Element> parteDestra = new LinkedList<>(); 
        
        // PRODUZIONI line
        
        parteDestra.add(tk1);
        p = new Produzione(line,parteDestra);
        line.addProduzione(p);
        parteDestra = new LinkedList<>(); 
        
        parteDestra.add(exp);
        parteDestra.add(tk1);
        p = new Produzione(line,parteDestra);
        line.addProduzione(p);
        
        
        // PRODUZIONI exp
        parteDestra = new LinkedList<>(); 
        parteDestra.add(tk2);
        p = new Produzione(exp,parteDestra,"$$ = $1;");
        exp.addProduzione(p);
        
        parteDestra = new LinkedList<>();
        parteDestra.add(exp);
        parteDestra.add(tk3);
        parteDestra.add(exp);
        p = new Produzione(exp,parteDestra,"$$ = $1+$3;");
        exp.addProduzione(p);
        
        parteDestra = new LinkedList<>();
        parteDestra.add(exp);
        parteDestra.add(tk4);
        parteDestra.add(exp);
        p = new Produzione(exp,parteDestra,"$$ = $1-$3;");
        exp.addProduzione(p);
        
        parteDestra = new LinkedList<>();
        parteDestra.add(exp);
        parteDestra.add(tk5);
        parteDestra.add(exp);
        p = new Produzione(exp,parteDestra,"$$ = $1*$3;");
        exp.addProduzione(p);
        
        parteDestra = new LinkedList<>();
        parteDestra.add(exp);
        parteDestra.add(tk6);
        parteDestra.add(exp);
        p = new Produzione(exp,parteDestra,"$$ = $1/$3;");
        exp.addProduzione(p);
        
        
        // PRODUZIONI input
        parteDestra = new LinkedList<>();
        p = new Produzione(input,parteDestra,"");
        input.addProduzione(p);
        
        parteDestra = new LinkedList<>();
        parteDestra.add(input);
        parteDestra.add(line);
        p = new Produzione(input,parteDestra,"");
        input.addProduzione(p);

        
        nonTerminali.add(input);
        nonTerminali.add(line);
        nonTerminali.add(exp);
        
        LinkedList<Token> right = new LinkedList<>();
        LinkedList<Token> left = new LinkedList<>();
        LinkedList<Token> nonassoc = new LinkedList<>();
        
        left.add(tk4);
        left.add(tk3);
        right.add(tk5);
        right.add(tk6);
        
//        System.out.println("\n\n1: "+tk4.getName());
//        System.out.println("\n\n1: "+tk3.getName());
//        System.out.println("\n\n1: "+tk5.getName());
//        System.out.println("\n\n1: "+tk6.getName());
        
        Grammatica grammatica = new Grammatica(tokens,nonTerminali,left,right,nonassoc);
        //genero l'istanza
        instance = new Generatore(grammatica,"Parser.y","Scanner.lex" );
    }
    
    @After
    public void tearDown() {
    }

    /**
     * Test of generaParser method, of class Generatore.
     */
    @Test
    public void testGeneraParser() {
        System.out.println("generaParser");
        
        instance.generaParser();
        
    }
    
    /**
     * Test of generaParser method, of class Generatore.
     */
    @Test
    public void testGeneraScanner() {
//        File dir1 = new File (".");
//        try {
//            System.out.println ("Current dir : " + dir1.getCanonicalPath());
//        } catch (IOException ex) {
//            ex.printStackTrace();
//        }
        System.out.println("generaScanner");
        instance.generaScanner();
    }
    
    
    @Test
    public void testGeneraMain() {
        System.out.println("generaMain");
        instance.generaMain();
    }
}
